home *** CD-ROM | disk | FTP | other *** search
/ Spanish Scene 1 / SpanishScene1.iso / spanish pack n°1 by llfb / --llfb-- / programas / sources1.dms / sources1.adf / SOURCES / Vectores / PolyDraw.ASM < prev    next >
Assembly Source File  |  1996-06-04  |  7KB  |  345 lines

  1. ; *** This routine draws a polygon, using the blitter, and fills
  2. ;     it with flood fill afterwards!
  3.  
  4. ; This version is really bugged.... 
  5.  
  6. ; [1] Use blitter logic to remove "double" points (type:xor)
  7. ; [2] Logic fill... Not entire screen, but only top-bottom
  8. ; [3] Copy to different bitplanes for colours 
  9. ; [4] Patterns as well (?) - Type Stencil Polygons
  10. ; [5] Shoot me or I'll blow myself to P.C.S.
  11.  
  12. ; *** Done by Tee Djay of PowerLords 03.07.1990
  13.  
  14.     Section    Roman,code_c
  15.  
  16. start:        move.l    4,a6
  17.         jsr    -132(a6)        ; forbid multitasking
  18.         move.w    $dff01c,old_intena
  19.         ori.w    #$8000,old_intena
  20.         move.w    #$03fdf,$dff09a        ; only vblank interrupt
  21.         move.w    #$7fff,$dff096
  22.         bsr.L    clr_sprites
  23.         bsr.L    set_bitplanes
  24.         bsr.L    make_sin_tab
  25.         move.l    #copper,$dff080
  26.         clr.w    $dff088
  27.         move.w    #$83ff,$dff096
  28.  
  29. main_loop:    cmp.b    #250,$dff006
  30.         bne.s    main_loop
  31.  
  32.         move.l    screen,d0
  33.         move.w    d0,bpls+6
  34.         swap    d0
  35.         move.w    d0,bpls+2
  36.  
  37.         move.l    screen,d0
  38.         move.l    scree2,screen
  39.         move.l    d0,scree2
  40.  
  41.         add.w    #6,angle
  42.         and.w    #510,angle
  43.  
  44.         lea    sincos,a0
  45.         lea    coords,a1
  46.         lea    polygon,a2
  47.  
  48.         move.w    #8-1,d2
  49. ml01:        move.w    angle,d0
  50.         move.w    d0,d1
  51.         add.w    #128,d1
  52.         and.w    #510,d0
  53.         and.w    #510,d1
  54.         move.w    (a0,d0.w),d0
  55.         move.w    (a0,d1.w),d1
  56.         move.w    (a1)+,d4
  57.         move.w    (a1)+,d5
  58.         move.w    d4,d6
  59.         move.w    d5,d7
  60.         muls    d1,d4
  61.         muls    d0,d5
  62.         muls    d0,d6
  63.         muls    d1,d7
  64.         swap    d4        
  65.         swap    d5        
  66.         swap    d6        
  67.         swap    d7
  68.         sub.w    d5,d4
  69.         add.w    d7,d6
  70.         add.w    #160,d4
  71.         add.w    #100,d6
  72.         move.w    d4,(a2)+
  73.         move.w    d6,(a2)+
  74.         dbra    d2,ml01
  75.  
  76.         move.l    screen,a0
  77.         move.w    #1999,d0
  78. ml02:        clr.l    (a0)+
  79.         dbra    d0,ml02
  80.  
  81.         lea    polygon,a0
  82.         moveq    #0,d7
  83.         bsr.L    draw_polygon    ; 1st polygon
  84. ;        lea    polygon,a0
  85. ;        bsr    plot_points
  86. ;        bsr    plot_points
  87.         bsr.L    fill_polygon
  88.         bsr.L    remove_zigs
  89.         lea    polygon+16,a0
  90.         move.w    #2,d7
  91.         bsr.L    draw_polygon    ; 2nd polygon
  92.  
  93.         btst    #6,$bfe001
  94.         bne.L    main_loop
  95.  
  96. end:        bsr.s    wait_blit
  97.         move.l    4,a6
  98.         move.l    #grname,a1
  99.         clr.l    d0
  100.         jsr    -552(a6)
  101.         move.l    d0,a4
  102.         move.l    38(a4),$dff080
  103.         clr.w    $dff088
  104.         move.w    #$83e0,$dff096
  105.         move.w    old_intena,$dff09a
  106.         jsr    -138(a6)        ; enable multitasking
  107.         clr.l    d0
  108.         rts
  109.  
  110. old_intena:    dc.w    0
  111.  
  112. wait_blit:    btst    #14,$dff002
  113.         bne.s    wait_blit
  114.         rts
  115.  
  116. set_bitplanes:    move.l    screen,d0
  117.         lea    bpls,a0
  118.         moveq    #3,d1
  119. set_bpl_pnt:    move.w    d0,6(a0)
  120.         swap    d0
  121.         move.w    d0,2(a0)
  122.         swap    d0
  123.         add    #40,d0
  124.         addq    #8,a0
  125.         dbra    d1,set_bpl_pnt
  126.         rts
  127.  
  128. clr_sprites:    lea    copspr,a0
  129.         move.l    #$0120,d0
  130.         move.l    #7,d1
  131. cl_spr_pnt:    move.w    d0,(a0)+
  132.         clr.w    (a0)+
  133.         add.w    #2,d0
  134.         move.w    d0,(a0)+
  135.         clr.w    (a0)+
  136.         add.w    #2,d0
  137.         dbra    d1,cl_spr_pnt
  138.         rts
  139.  
  140. Draw_Line:    movem.l    d0-d7/a0-a6,-(a7)
  141.  
  142.         cmp.w    d0,d2
  143.         bne.s    dl00
  144.         cmp.w    d1,d3
  145.         beq.L    end_line
  146.                     
  147. dl00:        cmp.w    #319,d0
  148.         bhi.L    end_line
  149.         cmp.w    #319,d2
  150.         bhi.L    end_line
  151.         cmp.w    #199,d1
  152.         bhi.L    end_line
  153.         cmp.w    #199,d3
  154.         bhi.L    end_line
  155.  
  156.         cmp.w    d1,d3
  157.         bge.s    dl10
  158.         exg    d2,d0
  159.         exg    d3,d1
  160. dl10:        move.w    d2,d4
  161.         sub.w    d0,d4
  162.         bmi.s    dl11
  163.         neg.w    d4
  164. dl11:        move.w    d1,d5
  165.         sub.w    d3,d5
  166.         beq.s    dl12
  167.         lsl.w    #1,d5
  168.         cmp.w    d4,d5
  169.         blt.s    dl12
  170.         subq    #1,d3
  171. dl12:
  172.         move.l    screen,a0    ; Start of screen
  173.         move.w    #40,a1        ; Width of screen (bytes)
  174.         move.w    a1,d4
  175.         mulu    d1,d4
  176.         moveq    #-16,d5
  177.         and.w    d0,d5
  178.         lsr.w    #3,d5
  179.         add.w    d5,d4
  180.         add.l    a0,d4
  181.         moveq    #0,d5
  182.         sub.w    d1,d3    ; Delta Y
  183.         roxl.b    #1,d5
  184.         tst.w    d3
  185.         bge.s    y2gy1
  186.         neg.w    d3
  187. y2gy1:        sub.w    d0,d2    ; Delta X
  188.         roxl.b    #1,d5
  189.         tst.w    d2
  190.         bge.s    x2gx1
  191.         neg.w    d2
  192. x2gx1:        move.w    d3,d1
  193.         sub.w    d2,d1    ; DeltaY-DeltaX
  194.         bge.s    dygdx
  195.         exg    d2,d3
  196. dygdx:        roxl.b    #1,d5
  197.         add.w    d2,d2    ; Smallest Delta*2
  198.  
  199.         bsr.L    wait_blit
  200.  
  201.         move.w    d2,$dff062    ; bltbmod
  202.         move.b    okttabelle(pc,d5),d5
  203.         sub.w    d7,d5
  204.         sub.w    d3,d2
  205.         bge.s    signnl
  206.         ori.b    #$40,d5
  207. signnl:        move.w    d2,$dff052    ; bltaptl
  208.         sub.w    d3,d2
  209.         move.w    d2,$dff064    ; bltamod
  210.         move.w    #$8000,$dff074    ; bltadat
  211.         move.w    #-1,$dff072    ; bltbdat
  212.         move.w    #-1,$dff044    ; bltafwm
  213.         andi.w    #15,d0
  214.         ror.w    #4,d0
  215.         or.w    #$0bca,d0
  216.         move.w    d0,$dff040    ; bltcon0
  217.         move.w    d5,$dff042    ; bltcon1
  218.         move.l    d4,$dff048    ; bltcpth
  219.         move.l    d4,$dff054    ; bltdpth
  220.         move.w    a1,$dff060    ; bltcmod
  221.         move.w    a1,$dff066    ; bltdmod
  222.         lsl.w    #6,d3
  223.         addq.w    #2,d3
  224.         move.w    d3,$dff058    ; bltsize
  225. end_line:    movem.l    (a7)+,d0-d7/a0-a6
  226.         rts
  227. okttabelle:    dc.b    3,19,11,23,7,27,15,31
  228.  
  229. make_sin_tab:    lea    sincos,a1
  230.         lea    sincos+512,a2
  231.         move.w    #63,d0
  232. msl02:        move.w    (a1)+,(a2)+
  233.         dbra    d0,msl02
  234.         lea    sincos+128,a0
  235.         lea    sincos+128,a1
  236.         move.w    #63,d0
  237. msl00:        move.w    -(a0),(a1)+
  238.         dbra    d0,msl00
  239.         move.w    #127,d0
  240. msl01:        move.w    (a0)+,d1
  241.         neg.w    d1
  242.         move.w    d1,(a1)+
  243.         dbra    d0,msl01
  244.         rts        
  245.  
  246. sincos:        dc.w    00000,00804,01607,02410,03211,04011
  247.         dc.w    04808,05602,06392,07179,07961,08739
  248.         dc.w    09512,10278,11039,11793,12539,13278
  249.         dc.w    14010,14732,15446,16151,16846,17530
  250.         dc.w    18204,18868,19519,20159,20787,21403
  251.         dc.w    22005,22594,23170,23732,24279,24812
  252.         dc.w    25330,25832,26319,26790,27245,27684
  253.         dc.w    28106,28511,28898,29269,29621,29956
  254.         dc.w    30273,30572,30852,31114,31357,31581
  255.         dc.w    31785,31971,32138,32285,32413,32521
  256.         dc.w    32610,32679,32728,32758
  257.         blk.b    512,0
  258.  
  259. grname:        dc.b    "graphics.library",0,0
  260.  
  261. copper:        dc.w    $008e,$4081,$0090,$08c1
  262.         dc.w    $0092,$0038,$0094,$00d0
  263.         dc.w    $0102,$0000,$0104,$0000
  264.         dc.w    $0108,$0000,$010a,$0000
  265.         dc.w    $0100,$1200
  266.         dc.w    $0180,$0000,$0182,$0fff
  267. copspr:        blk.b    64,0
  268. bpls:        dc.w    $00e0,$0000,$00e2,$0000
  269.         dc.w    $00e4,$0000,$00e6,$0000
  270.         dc.w    $00e8,$0000,$00ea,$0000
  271.         dc.w    $00ec,$0000,$00ee,$0000    
  272.         dc.w    $ffff,$fffe
  273.  
  274. scr_buffer:    blk.b    2*8000,0
  275. screen:        dc.l    scr_buffer
  276. scree2:        dc.l    scr_buffer+8000
  277.  
  278. angle:        dc.w    32
  279. polypos:    dc.w    0,0            ; Top left corner
  280. polyblitsize:    dc.w    0,0            ; length/width
  281. polygon:    blk.b    32,0
  282.  
  283. coords:        dc.w    -90,-90,-20,-90,-20,-20,-90,-20
  284.         dc.w    090,-90,090,090,-90,090,-90,90
  285.  
  286. ; *** NOTE! Coordinates for a polygon - the specific order!
  287.  
  288. draw_polygon:    move.w    (a0)+,d0
  289.         move.w    (a0)+,d1
  290.         move.w    (a0)+,d2
  291.         move.w    (a0)+,d3
  292.         bsr.L    draw_line
  293.         move.w    (a0)+,d0
  294.         move.w    (a0)+,d1
  295.         bsr.L    draw_line
  296.         move.w    (a0)+,d2
  297.         move.w    (a0)+,d3
  298.         bsr.L    draw_line
  299.         move.w    -16(a0),d0
  300.         move.w    -14(a0),d1
  301.         bsr.L    draw_line
  302.         rts
  303.  
  304. fill_polygon:    bsr.L    wait_blit
  305.         move.l    screen,d0
  306.         add.l    #7998,d0
  307.         move.l    d0,$dff054
  308.         move.l    d0,$dff050
  309.         move.l    #$09f0000a,$dff040
  310.         move.l    #-1,$dff044
  311.         move.l    #0,$dff064
  312.         move.w    #64*200+20,$dff058
  313.         rts
  314.  
  315. remove_zigs:    move.l    screen,a0
  316.         adda.l    #7960,a0
  317.         bsr.L    wait_blit
  318.         move.w    #199,d0
  319. rz00:        tst.w    (a0)
  320.         beq.s    rz01
  321.         move.l    a0,a1
  322.         move.w    #9,d1
  323. rz02:        clr.l    (a1)+
  324.         dbra    d1,rz02
  325. rz01:        suba.l    #40,a0
  326.         dbra    d0,rz00
  327.         rts
  328.  
  329. plot_points:    move.w    #3,d2
  330. pp00:        move.w    (a0)+,d0
  331.         move.w    (a0)+,d1
  332.         mulu    #40,d1
  333.         move.w    d0,d3
  334.         and.w    #7,d3
  335.         lsr.w    #3,d0
  336.         add.w    d0,d1
  337.         add.l    screen,d1
  338.         move.l    d1,a1
  339.         neg    d3
  340.         add.w    #7,d3
  341.         bset    d3,(a1)
  342.         dbra    d2,pp00
  343.         rts
  344.         
  345.